//
//  RefreshShowTableViewController.swift
//  SwiftRx研究
//
//  Created by 世霖 on 2020/7/16.
//  Copyright © 2020 世霖. All rights reserved.
//

import UIKit
import RxCocoa
import RxDataSources
import RxSwift
import ObjectMapper

class RefreshShowTableViewController: UIViewController {

    @IBOutlet weak var refreshBar: UIButton!
    //表格
     var tableView:UITableView!
      
     let disposeBag = DisposeBag()
      
    override func viewDidLoad() {
        super.viewDidLoad()
        //创建表格视图
            self.tableView = UITableView(frame: self.view.frame, style:.plain)
            //创建一个重用的单元格
            self.tableView!.register(UITableViewCell.self,
                                     forCellReuseIdentifier: "Cell")
            self.view.addSubview(self.tableView!)
     
        
//        随机产生数据
        
//        我们也对源头进行限制下。即通过 throttle 设置个阀值（比如 1 秒），如果在1秒内有多次点击则只取最后一次，那么自然也就只发送一次数据请求
//        let randomResult = refreshBar.rx.tap.asObservable()
//        .startWith(())
//            .flatMap(getRandomResult().) // 可以更换为flapMapLast ，使用的是最后一个数据类型
//
//        .share(replay: 1)
//
        
//           let randomResult = refreshBar.rx.tap.asObservable()
//                .startWith(())
//            .flatMapLatest({
//                self.getRandomResult().takeUntil(self.refreshBar.rx.tap)
//            }) // 可以更换为flapMapLast ，使用的是最后一个数据类型
//            .share(replay: 1)
//
//
//
        
        let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String , Int >>(
        configureCell: {(dataSource , tv , indexPath , element ) in
            let  cell = tv.dequeueReusableCell(withIdentifier: "Cell")!
            cell.textLabel?.text = "条目\(indexPath.row)：\(element)"
            return cell
            
            }
            
        )
        //绑定单元格数据
//        randomResult
//            .bind(to: tableView.rx.items(dataSource: dataSource))
//            .disposed(by: disposeBag)
        
        
        
        
//         这里我们在前面样例的基础上增加了个“停止”按钮。当发起请求且数据还未返回时（2 秒内），按下该按钮后便会停止对结果的接收处理，即表格不加载显示这次的请求数据。
//        func fileterResult(data:[SectionModel<String , Int>]) -> Observable<[SectionModel<String , Int>]>{
//            
////            return self.
//            
//        }
        
        
        
        let urlString  = "https://www.douban.com/j/app/radio/channels"
        let url  = URL(string: urlString)
        //创建请求对象
        let request = URLRequest(url: url!)
        
        
        /// 如果不需要获取底层的 response，只需知道请求是否成功，以及成功时返回的结果，那么建议使用 rx.data。
//        因为 rx.data 会自动对响应状态码进行判断，只有成功的响应（状态码为 200~300）才会进入到 onNext 这个回调，否则进入 onError 这个回调。

    
//        创建并发起请求
        URLSession.shared.rx.response(request: request)
            .subscribe(onNext: { (res ,data ) in
//                数据处理
                let str  = String(data: data , encoding: String.Encoding.utf8)
                print(str)
                
                if 200 ..< 300 ~= res.statusCode {
                    let str =  String(data: data , encoding: String.Encoding.utf8)
                }
                
            }).disposed(by: disposeBag)
        
//        还有更简单的方法，就是直接使用 RxSwift 提供的 rx.json 方法去获取数据，它会直接将结果转成 JSON 对象。
        
        URLSession.shared.rx.json(request: request).subscribe(onNext: { data in
            let json = data as! [String: Any]
            print(json)
            }).disposed(by: disposeBag)
        
        
        let data = URLSession.shared.rx.json(request: request).map{result -> [[String : Any ]] in
            if let data = result as? [String:Any] {
                let channels = data["channerls"] as? [[String:Any]]
                
                return channels!
            }else   {
                return []
            }
            
        }
            
        
        data.bind(to: tableView.rx.items) { (tableView , row , element ) in
            
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
                       cell.textLabel?.text = "\(row)：\(element["name"]!)"
                       return cell
        }.disposed(by: disposeBag)
        
        
        
    }
    func getRandomResult() -> Observable<[SectionModel<String , Int>]> {
        print("正在请求的数据")
        let items = (0 ..< 5).map {  _  in
            Int(arc4random())
        }
        let observable = Observable.just([SectionModel(model: "5", items: items)])
        return observable.delay(2, scheduler: MainScheduler.instance)
    }
}
